home *** CD-ROM | disk | FTP | other *** search
/ Enter 2006 February / enter-2006-02.iso / files / Illustrator_CS2_ue_TryOut.exe / bridge / Adobe Bridge 1.0.msi / Data1.cab / scripts.js < prev    next >
Encoding:
Text File  |  2005-03-24  |  21.3 KB  |  807 lines

  1. //------------------------------------------------------------------------------
  2. //
  3. // ADOBE SYSTEMS INCORPORATED
  4. // Copyright 2004 Adobe Systems Incorporated
  5. // All Rights Reserved
  6. //
  7. // NOTICE: Adobe permits you to use, modify, and distribute
  8. // this file in accordance with the terms of the Adobe license
  9. // agreement accompanying it. If you have received this file
  10. // from a source other than Adobe, then your use, modification,
  11. // or distribution of it requires the prior written permission
  12. // of Adobe.
  13. //
  14. // $LastChangedRevision: 160 $
  15. //------------------------------------------------------------------------------
  16.  
  17.  
  18.  
  19.  
  20. // some "constants"
  21. COLUMNMINWIDTH         = 220;
  22.  
  23.  
  24. // globals
  25. selectedSessionRow     = null;
  26. selectedSessionID    = 0;
  27. shortlist = true;
  28. shortlimit = 7;
  29. selectedrss        = false;
  30.  
  31. // parts of this function may need to change for different localizations
  32. function localizeDate(mydate) {
  33. //    9/29/04, 7:58:14 PM
  34.     var month    = mydate.getMonth()+1;                            // get month
  35.     var day        = mydate.getDate()+1;                            // get day
  36.     var year    = mydate.getFullYear().toString().substr(-2);    // get year
  37.     var hour    = mydate.getHours();                            // get hour
  38.     var min        = mydate.getMinutes();                            // get min
  39.     var sec        = mydate.getSeconds();                            // get sec
  40.     
  41.     // wrap hour and get AM/PM
  42.     var ampm = 'AM';
  43.     if (hour > 12) {
  44.         hour = hour%=12;
  45.         ampm = 'PM';
  46.     }
  47.         
  48.  
  49.     // set return string, this is the part tha will need to change    
  50.     var output = month + '/' + day + '/' + year + ', ' + hour + ':' + min + ' '+ampm;
  51.     
  52.     
  53.     
  54.     return output;
  55. }
  56.  
  57.  
  58. function writeRecentFolders() {
  59.     var output = '';
  60.     var item = false;
  61.     var l = (shortlist) ? shortlimit:recentfolders.length;
  62.     l = (l<recentfolders.length) ? l:recentfolders.length;
  63.     for (var i=0; i<l; i++) {
  64.         item = recentfolders[i];
  65.         if (item.numitems == null) item.numitems='';
  66.         output += '<tr onclick="location.href=\'' + item.url + '\'">';
  67.             output    += '<td class="thumbnail"><div>'+item.numitems+'</div><\/td>';
  68.             output    += '<td><h3><a href="' + item.url + '">' + unescape(item.name) + '<\/a><\/h3>';
  69.             output    += unescape(item.path);
  70.             output    += '<br />';
  71.             output    += item.date;
  72.             output    += '</td>';            
  73.         output    += '<\/tr>';
  74.     }
  75.     document.getElementById('recentfolders').getElementsByTagName("table")[0].innerHTML = output;
  76. }
  77.  
  78.  
  79. function writeRecentFiles() {
  80.     var output = '';
  81.     var item = false;
  82.     var l = (shortlist) ? shortlimit:recentfiles.length;
  83.     l = (l<recentfiles.length) ? l:recentfiles.length;
  84.     for (var i=0; i<l; i++) {
  85.         item = recentfiles[i];
  86.         // skip empties
  87.         if (item.name == '') continue;
  88.         // skip if no thumbanail w and h
  89.         if (isNaN(item.width) || isNaN(item.height)) {
  90.             item.width = 35;
  91.             item.height = 35;
  92.         }
  93.         
  94.         // calc w and h
  95.         if (item.width > item.height) {
  96.             var w = 45;
  97.             var h = Math.round(item.height / (item.width/45));
  98.         } else if (item.height > item.width) {
  99.             var h = 45;
  100.             var w = Math.round(item.width / (item.height/45));
  101.         } else {
  102.             var h = 45;
  103.             var w = 45;
  104.         }
  105.  
  106.         output += '<tr>';
  107.         output    += '<td class="thumbnail" onclick="location.href=\'' + item.url + '\'"><img src="' + item.thumbnail + '" alt="" width="' + w + '" height="' + h + '" \/><\/td>';
  108.         output    += '<td  onclick="location.href=\'' + item.url + '\'"><h3><a href="' + item.url + '">' + unescape(item.name) + '<\/a><\/h3>';
  109.         output    += item.date;
  110.         output    += '<\/td>';    
  111.         output    += '<td class="reveal" onclick="location.href=\'' + item.revealurl + '\'"><img src="_media/shell.png" width="19" height="25" alt="Click to Reveal" \/><\/td><\/tr>';
  112.     }
  113.     document.getElementById('recentfiles').getElementsByTagName("table")[0].innerHTML = output;
  114. }
  115.  
  116. function writeSessions() {
  117.     var output = '';
  118.     var item = false;
  119.     for (var i=0; i<sessions.length; i++) {
  120.         item = sessions[i];
  121.         output += '<tr onclick="selectSession('+i+', this)">';
  122.         output    += '<td class="thumbnail"><div>'+item.totalitems+'</div><\/td><td class="info">';
  123.         output    += '<h3>' + item.name + '<\/h3>';
  124.         output    += localizeDate(item.date);
  125.         output    += '<\/td><\/tr>';
  126.     }
  127.     document.getElementById('groupscontenttable').innerHTML = output;
  128. }
  129.  
  130.  
  131. function selectSession(index, element) {
  132.     // restore current row if it's set
  133.     if (selectedSessionRow) selectedSessionRow.style.backgroundColor = "transparent";
  134.  
  135.     // set color for the row
  136.     element.style.backgroundColor = "#CDE086";
  137.     
  138.     // show launch icon
  139.     document.getElementById('launch').style.visibility = "visible";
  140.  
  141.     // display close button
  142.     document.getElementById('deselect').style.visibility = "visible";
  143.  
  144.     // hide blurb and off text
  145.     document.getElementById('groupcontrols').style.visibility = "hidden";
  146.     document.getElementById('groupoff').style.display = "none";
  147.  
  148.     // display information for this session    
  149.     document.getElementById('groupon').style.display = "block";
  150.     
  151.     // display delete button
  152.     document.getElementById('groupremove').style.display = "block";
  153.  
  154.     
  155.     // get information for the session
  156.     var me = sessions[index];
  157.     var tabledata = '';
  158.         // add photoshop
  159.         if (me.photoshop.length) {
  160.             tabledata = "<tr><td class='num'>"+me.photoshop.length+"</td><td>Photoshop File";
  161.             tabledata += (me.photoshop.length >= 2) ? "s":"";
  162.             tabledata += "</td></tr>";
  163.         }
  164.  
  165.         // add illustrator
  166.         if (me.illustrator.length) {
  167.             tabledata += "<tr><td class='num'>"+me.illustrator.length+"</td><td>Illustrator File";
  168.             tabledata += (me.illustrator.length > 1) ? "s":"";
  169.             tabledata += "</td></tr>";
  170.         }
  171.  
  172.         // add indesign
  173.         if (me.indesign.length) {
  174.             tabledata += "<tr><td class='num'>"+me.indesign.length+"</td><td>InDesign File";
  175.             tabledata += (me.indesign.length > 1) ? "s":"";
  176.             tabledata += "</td></tr>";
  177.         }
  178.  
  179.         // add golive
  180.         if (me.golive.length) {
  181.             tabledata += "<tr><td class='num'>"+me.golive.length+"</td><td>GoLive File";
  182.             tabledata += (me.golive.length > 1) ? "s":"";
  183.             tabledata += "</td></tr>";
  184.             
  185.         }
  186.     
  187.     document.getElementById('groupon').getElementsByTagName("table")[0].innerHTML = tabledata;
  188.     
  189.     // set global for selected row
  190.     selectedSessionRow    = element;
  191.     selectedSessionID    = index;
  192.     
  193.     // add rollout
  194. //    document.getElementById('groups').onmouseout = deselectSession;
  195.  
  196. }
  197.  
  198. function deselectSession() {
  199.     var inside = elementContains(document.getElementById('groups'), window.event.toElement);
  200.  
  201.     // skip events inside the table
  202.     if(inside) return;
  203.  
  204.     // restore current row if it's set
  205.     if (selectedSessionRow) selectedSessionRow.style.backgroundColor = "transparent";
  206.     
  207.     // hide launch icon
  208.     document.getElementById('launch').style.visibility = "hidden";
  209.     // hide close button
  210.     document.getElementById('deselect').style.visibility = "hidden";
  211.  
  212.     // show blurb and off text
  213.     document.getElementById('groupcontrols').style.visibility = "visible";
  214.     document.getElementById('groupoff').style.display = "block";
  215.  
  216.     // hide information for this session    
  217.     document.getElementById('groupon').style.display = "none";
  218.     
  219.     // hide delete button
  220.     document.getElementById('groupremove').style.display = "none";
  221.         
  222.     // set global for selected row
  223.     selectedSessionRow    = false;
  224.     selectedSessionID    = false;
  225.     
  226.     // remove rollout
  227.     delete(document.getElementById('groups').onmouseout);
  228.  
  229. }
  230.  
  231.  
  232. function openSession() {
  233.     call('openSession', selectedSessionID);
  234. }
  235.  
  236. function removeSession() {
  237.     call('removeSession', selectedSessionID);
  238.     deselectSession();
  239. }
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246. function sortRecentFoldersBy(prop, caller) {
  247.     if (recentfolders.sortby == prop) {
  248.         recentfolders.reverse();
  249.     } else {
  250.         recentfolders.sortby        = prop;
  251.         recentfolders.sort(sortOn);
  252.     }
  253.     
  254.     writeRecentFolders();
  255.     
  256.     // reset sort method indicator
  257.     var nav = document.getElementById('recentfolders').getElementsByTagName('div')[0].getElementsByTagName('a');
  258.     for (var i=0; i<nav.length; i++) {
  259.         nav[i].style.textDecoration = 'none';
  260.     }
  261.     caller.style.textDecoration = "underline";
  262. }
  263.  
  264. function sortRecentFilesBy(prop, caller) {
  265.     if (recentfiles.sortby == prop) {
  266.         recentfiles.reverse();
  267.     } else {
  268.         recentfiles.sortby = prop;
  269.         recentfiles.sort(sortOn);
  270.     }    
  271.     
  272.     
  273.  
  274.  
  275.     writeRecentFiles();
  276.  
  277.     // reset sort method indicator
  278.     var nav = document.getElementById('recentfiles').getElementsByTagName('div')[0].getElementsByTagName('a');
  279.     for (var i=0; i<nav.length; i++) {
  280.         nav[i].style.textDecoration = 'none';
  281.     }
  282.     caller.style.textDecoration = "underline";
  283. }
  284.  
  285.  
  286. /**
  287. * Sorts an array of objects on prop defined in the sortby prop of the array
  288. */
  289. function sortOn(a, b) {
  290.     a = a[this.sortby].toLowerCase();
  291.     b = b[this.sortby].toLowerCase();
  292.     
  293.     if (a > b) {
  294.         return 1;
  295.     }
  296.     if (a < b) {
  297.         return -1;
  298.     }
  299.     return 0;
  300.  
  301. }
  302.  
  303.  
  304. /**
  305. * FUNCTIONS FOR SESSIONS
  306. */
  307. // save a session of the currently open documents in all CS apps
  308. function saveSession() {
  309.     var session = eval(call('getSessionData'));
  310. }
  311.  
  312. function loadSessions() {
  313.     sessions = eval(call('loadSessions'));
  314.     // convert dates to objects
  315.     for (var i in sessions) {
  316.         sessions[i].date = new Date(sessions[i].date);
  317.     }
  318. }
  319.  
  320.  
  321.  
  322.  
  323.  
  324.  
  325. /*************
  326. * TIPS
  327. **************/
  328. // non-repeating random number object. use myVar = new NrRnd(size)
  329. // where size is one more than the highest possible return value (so one can create with .length)
  330. function NrRnd(size) {
  331.     this.top = size;
  332.     this.l = size;
  333.     this.src = new Array();
  334.     for (var i=0; i<size; i++) {
  335.         this.src[i] = i;
  336.     }
  337. }
  338. NrRnd.prototype.getNum = function () {
  339.     if (this.l == 0) {
  340.         for (var i=0; i<this.top; i++) {
  341.             this.src[i] = i;
  342.         }
  343.         this.l = this.top;
  344.     }
  345.     var r = Math.floor(Math.random() * this.l);
  346.     var picked = this.src[r];
  347.     this.src.splice(r,1);
  348.     this.l--;
  349.     return picked;
  350. }
  351.  
  352.  
  353. function initTips() {
  354.     // join cstips and dvatips arrays if dvatips is defined
  355.     cstips.concat(dvatips);
  356.     tiprnd = new NrRnd(cstips.length);
  357.     nextTip();
  358. }
  359.  
  360. function writeTip(n) {
  361.     document.getElementById('maintip').innerHTML = cstips[n];
  362. }
  363.  
  364. function lastTip() {
  365.     if (tippos > 1) tippos--;
  366.     var n = tiphistory[tippos-1];
  367.     writeTip(n);
  368. }
  369.  
  370. function nextTip() {
  371.     var n;
  372.     // if we are at the end show a new tip, otherwise go forward in hist
  373.     if (tiphistory.length == 0 || tippos == tiphistory.length) {
  374.         n = tiprnd.getNum();
  375.         tiphistory[tiphistory.length] = n;
  376.     } else {
  377.         n = tiphistory[tippos];
  378.     }
  379.     tippos++;
  380.     writeTip(n);
  381. }
  382.  
  383. /**
  384. * update display of column title depending on col size
  385. * currently un-used until bridge is fixed
  386. */
  387. function setColumnTitleForSize() {
  388.     var sessions = document.getElementById('groups');
  389.     if (sessions.clientWidth < COLUMNMINWIDTH) {    // icon only
  390.         sessions.getElementsByTagName("h2")[0].className = 'short';
  391.     } else {                                    // full
  392.         sessions.getElementsByTagName("h2")[0].className = 'full';
  393.     }
  394.  
  395.     var folders = document.getElementById('recentfolders');
  396.     if (folders.clientWidth < COLUMNMINWIDTH) {    // icon only
  397.         folders.getElementsByTagName("h2")[0].className = 'short';
  398.     } else {                                    // full
  399.         folders.getElementsByTagName("h2")[0].className = 'full';
  400.     }
  401.  
  402.     var files = document.getElementById('recentfiles');
  403.     if (files.clientWidth < COLUMNMINWIDTH) {    // icon only
  404.         files.getElementsByTagName("h2")[0].className = 'short';
  405.     } else {                                    // full
  406.         files.getElementsByTagName("h2")[0].className = 'full';
  407.     }
  408.     
  409. }
  410.  
  411.  
  412. // ------------------------------------------------------------
  413. //    RSS
  414. // ------------------------------------------------------------
  415. function writeRSSLoader() {
  416.     var rssrefresh = call('loadRefresh');
  417.     var rsslist = '';
  418.     if (rssfeeds.length > 0) rsslist = '&location=' + escape(rssfeeds);
  419.     var output = '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" width="30" height="30" align="middle">';
  420.     output += '<embed src="_media/rssloader.swf?refresh='+rssrefresh+rsslist+'" quality="high" wmode="transparent" bgcolor="#e4e4e4" width="10" height="10" name="rssloadermovie" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />';
  421.     output += '<\/object>';    
  422.     document.getElementById('rssloader').innerHTML = output;
  423.     
  424.     // clear channels
  425.     document.getElementById('rsschannels').innerHTML = '';
  426. }
  427.  
  428. function addRSSChannel(id, title, description, link, url, items) {
  429.     items = eval(items);
  430.     id = rssdata.length;
  431.     rssdata[id] = {
  432.         title:            title,
  433.         description:    description,
  434.         url:            url,
  435.         link:            link,
  436.         items:            items
  437.     }
  438.  
  439.     // display the item
  440.     var channels = document.getElementById('rsschannels');
  441.  
  442.     var dt = document.createElement('dt');
  443. //    var dttext = document.createTextNode(title);
  444. //    dt.appendChild(dttext);
  445.     dt.innerHTML = title;
  446.     dt.id = id;
  447.     
  448.     // see if it's an adobe default, which can't be removed
  449.     var isadobe = false;
  450.     for (var i=0; i<BC_RSS_DEFAULT_FEEDS.length; i++) {
  451.         if (url == BC_RSS_DEFAULT_FEEDS[i]) {
  452.             isadobe = true;
  453.             break;
  454.         }
  455.     }
  456.  
  457.     if (isadobe) {
  458.         dt.onclick = function() {
  459.             displayRSSChannel(this,id);
  460.         }
  461.         dt.className = 'adobe';
  462.     } else {
  463.         dt.onclick = function() {
  464.             displayRSSChannel(this,id);
  465.         }
  466.     }
  467.     
  468.     var dd = document.createElement('dd');
  469.     var ddtext = document.createTextNode('('+items.length+')');
  470.     dd.appendChild(ddtext);
  471.     
  472.     channels.appendChild(dt);
  473.     channels.appendChild(dd);
  474.     
  475.     // show first feed
  476.     displayRSSChannel(dt, id);
  477. }
  478.  
  479. function displayRSSChannel(element, id) {
  480.     if (selectedrss) selectedrss.style.backgroundColor = 'transparent';
  481.     element.style.backgroundColor = '#CAB097';
  482.     selectedrss = element;
  483.  
  484.     // if an adobe feed, hide remove button
  485.     if (element.className == 'adobe') {
  486.         disableRSSRemove();
  487.     } else {
  488.         enableRSSRemove();
  489.     }
  490.  
  491.     var items = rssdata[id].items;
  492.     var rssitems = document.getElementById('rssitems');
  493.     rssitems.innerHTML = '';
  494.     var dd, dt, ddtext, dttext, item;
  495.     for (var i=0; items.length; i++) {
  496.         item = eval(items[i])
  497.         dt = document.createElement('dt');
  498.         dt.onclick = function () {rss_toggle(this)}
  499.         dt.innerHTML = item[0];
  500.         
  501.         dd = document.createElement('dd');
  502.         
  503.         // take out images
  504.         dd.innerHTML = item[1].replace(/<img[^>]*>/,'') 
  505.         
  506.         // add link
  507.         dd.innerHTML += ' <a href="external:'+item[2]+'">More...</a>';
  508.         
  509.         rssitems.appendChild(dt);
  510.         rssitems.appendChild(dd);
  511.     }
  512. }
  513.  
  514. // disables remove button for default feeds;
  515. function disableRSSRemove() {
  516.     document.getElementById('rssremovelink').style.display = 'none';
  517. }
  518.  
  519. // enables remove button for default feeds;
  520. function enableRSSRemove() {
  521.     document.getElementById('rssremovelink').style.display = 'inline';
  522. }
  523.  
  524. // dhtml controls ------
  525. function rss_toggle(element) {
  526.     var story = element.nextSibling;
  527.     if (story.style.display == 'none' || story.style.display == ''){
  528.         story.style.display = 'block';
  529.         element.className = 'open';
  530.     } else {
  531.         story.style.display = 'none';
  532.         element.className = 'closed';
  533.     }
  534. }
  535.  
  536. function toggleRSSandTips() {
  537.     try {
  538.         var rsstipsrow = document.getElementById('rsstipsrow');
  539.         var offset = 160;
  540.         
  541.         // if it's closed, open it up.
  542.         if (rsstipsrow.className == 'closed'){
  543.             rsstipsrow.className = 'open';
  544.             document.getElementById('togglelf').className = 'open';
  545.             document.getElementById('togglert').className = 'open';
  546.             
  547.             // change height of top elements
  548.             document.getElementById('groups').className            = 'section';
  549.             document.getElementById('recentfolders').className     = 'section';
  550.             document.getElementById('recentfiles').className     = 'section';
  551.             
  552.         
  553.         // close it
  554.         } else {
  555.             rsstipsrow.className = 'closed';
  556.             document.getElementById('togglelf').className = 'closed';
  557.             document.getElementById('togglert').className = 'closed';
  558.     
  559.             // change height of top elements
  560.             document.getElementById('groups').className            = 'section long';
  561.             document.getElementById('recentfolders').className     = 'section long';
  562.             document.getElementById('recentfiles').className     = 'section long';
  563.             
  564.         }
  565.     
  566.         // toggle shortlist
  567.         shortlist = !shortlist;
  568.         
  569.         // and redraw top cols
  570.         writeSessions();
  571.         writeRecentFiles();
  572.         writeRecentFolders();
  573.         writeRSSLoader();
  574.     
  575.         // save the state
  576.         call('setRSSToggleState', rsstipsrow.className);
  577.     } catch (e) {
  578.         alert(e);
  579.     }
  580. }
  581.  
  582.  
  583. // extend script hooks ------
  584. function addRSSFeed() {
  585.     var url = prompt('Type the URL for the new RSS feed', 'http://');
  586.     if (url == '' || !url) return;
  587.     call('addRSSFeed', url);
  588.  
  589. }
  590.  
  591. function removeRSSFeed() {
  592.     var url = rssdata[selectedrss.id].url;
  593.     if (url == '' || !url) return;
  594.     call('removeRSSFeed', url);
  595. }
  596.  
  597. function RSSerror(url) {
  598.     // load list of sites to skip the prompt on
  599.     var skip = call('getSkipRSSKill');
  600.     skip = skip.split('  ');
  601.     skip = skip.concat(BC_RSS_DEFAULT_FEEDS);
  602.     for (var i=0; i<skip.length; i++) {
  603.         if (url == skip[i]) return;
  604.     }
  605.  
  606.     var kill = confirm('The site '+url+' cannot be displayed by this RSS reader: The site is either not supported by this reader, a non-RSS site, or there may be a problem with your internet connection. Permanently remove from your list of sites?');
  607.     if (kill) {
  608.         call('removeRSSFeed', url);
  609.     } else {
  610.         call('setSkipRSSKill', url);
  611.     }
  612.     
  613. }
  614.  
  615. function setRefresh() {
  616.     var t = call('loadRefresh');
  617.     if (t == '') t = 4;
  618.     var time = prompt('Enter refresh interval, in hours:', t);
  619.     if (time == undefined) return;
  620.     time = parseInt(time);
  621.     while (isNaN(time)) {
  622.         time = prompt('You must enter a number, in hours:', t);
  623.         if (time == undefined) return;
  624.     }
  625.     
  626.     if (time < .5) time = .5;
  627.     call('setRefresh', time);
  628.     reloadRSS();
  629. }
  630.  
  631.  
  632. function loadRSSFeeds() {
  633.     var feeds = call('loadRSSFeeds');
  634.     
  635.     // split out adobe feeds from user feeds
  636.     var s = feeds.split('    ');
  637.     BC_RSS_DEFAULT_FEEDS = s[0].split('  ');
  638.     rssfeeds = s[0]+'  '+s[1];
  639. }
  640.  
  641. function reloadRSS() {
  642.     loadRSSFeeds();
  643.     writeRSSLoader();
  644. }
  645.  
  646.  
  647. // ------------------------------------------------------------
  648.  
  649.  
  650.  
  651. /**
  652. * on load setup sessions and get number of items in recent folders
  653. **/
  654. window.onload = function() {
  655.     recentfolders = [];
  656.     recentfiles = [];
  657.  
  658.     // parse recent folders
  659.     var recentNodes = document.getElementById('recentfolderdata').getElementsByTagName('p');
  660.     var folder;
  661.     for (var i=0; i<recentNodes.length; i++) {
  662.         folder = recentNodes[i].getElementsByTagName('span');
  663.  
  664.         // skip empties
  665.         if (unescape(folder[0].innerHTML) == '') continue;
  666.         recentfolders.push(
  667.             {
  668.                 order:        i,
  669.                 name:        truncateName(unescape(folder[0].innerHTML), 20),
  670.                 path:        truncatePath(folder[1].innerHTML),
  671.                 url:        (folder[2].innerHTML),
  672.                 date:        (folder[3].innerHTML),
  673.                 alt:        (folder[4].innerHTML),
  674.                 numitems:    call('getFileCountForDirectory', (folder[1].innerHTML))
  675.             }
  676.         );
  677.     }
  678.  
  679.  
  680.  
  681.     // parse recent files
  682.     recentNodes = document.getElementById('recentfiledata').getElementsByTagName('p');
  683.     var file;
  684.     for (var i=0; i<recentNodes.length;i++) {
  685.         file = recentNodes[i].getElementsByTagName('span');
  686.  
  687.         // skip empties
  688.         if (unescape(file[6].innerHTML) == '') continue;
  689.         recentfiles.push(
  690.             {
  691.                 order:            i,
  692.                 url:            (file[0].innerHTML),
  693.                 date:            (file[1].innerHTML),
  694.                 alttext:        (file[2].innerHTML),
  695.                 thumbnail:        call('checkForThumbnail', file[3].innerHTML),
  696.                 application:    (file[4].innerHTML),
  697.                 kind:            (file[5].innerHTML),
  698.                 name:            truncateName(file[6].innerHTML, 25),
  699.                 revealurl:        (file[7].innerHTML),
  700.                 height:            parseInt(file[8].innerHTML),
  701.                 width:            parseInt(file[9].innerHTML)
  702.             }
  703.         );
  704.     }
  705.  
  706.     
  707.     // get session info
  708.     loadSessions();
  709.  
  710.     // show everything
  711.     writeRecentFolders();
  712.     writeRecentFiles();
  713.     writeSessions();
  714.     
  715.     // tips
  716.     tiphistory    = [];
  717.     tippos        = 0;
  718.     initTips();
  719.  
  720.     // get rss info
  721.     rssdata = [];
  722.     loadRSSFeeds();
  723.     writeRSSLoader();
  724.     // make sure it's visible
  725.     if (call('getRSSToggleState') == 'closed') toggleRSSandTips();
  726.     
  727.     setColumnTitleForSize();
  728.  
  729. }
  730.  
  731. window.onresize = setColumnTitleForSize;
  732.  
  733.  
  734.  
  735.  
  736. // ------------------------------------------------
  737. // utilities
  738. /**
  739. * returns true if elmOuter contains elmInner
  740. */
  741. function elementContains(elmOuter, elmInner) {
  742.   while (elmInner && elmInner != elmOuter) {
  743.     elmInner = elmInner.parentNode;
  744.   }
  745.   if (elmInner == elmOuter) {
  746.     return true;
  747.   }
  748.   return false;
  749. }
  750.  
  751.  
  752. /**
  753. * truncates file paths
  754. */
  755. function truncatePath(path) {
  756.     var maxlen = 25;    
  757.     if (path == '' || path == undefined) return '';
  758.     if (path.length <= maxlen) return path;
  759.     
  760.     // if there is a scheme, return ''
  761.     var pat = /^[^:]*:\/\//;
  762.     if(pat.test(path)) return '';
  763.     
  764.     var os = (navigator.userAgent.toLowerCase().indexOf('mac') >= 0) ? 'mac':'win';
  765.     if (os == 'mac') {
  766.         var delim = '/';
  767.     } else {
  768.         var delim = '\\';
  769.     }
  770.     if (path.indexOf(delim) < 0) return path;
  771.     var parts = path.split(delim);
  772.     
  773.     // grab last element of path
  774.     var name = parts[parts.length-2];
  775.     // fix really long names
  776.     if (name.length > maxlen) name = truncateName(name, 8);
  777.     
  778.     var newpath = '...'+delim+name+delim;
  779.  
  780.     // now loop through first path element and add as much as you can until you hit the max length
  781.     var i = 0;
  782.     var pathhead = delim;
  783.     while((pathhead.length + newpath.length) < maxlen) {
  784.         pathhead += parts[1].charAt(i);
  785.         i++;
  786.         if (i==parts[1].length) {
  787.             pathhead += delim;
  788.             break;
  789.         }
  790.     }
  791.  
  792.     return pathhead + newpath;
  793. }
  794.  
  795.  
  796. function truncateName(name, newlen) {
  797.     if (name.length < newlen) return name;
  798.     
  799.     // find the extension
  800.     var extension = '';
  801.     if (name.indexOf('.') > -1) {
  802.         extension = name.substring(name.lastIndexOf('.'));
  803.         newlen -= extension.length;
  804.     }
  805.     return name.substring(0, newlen)+'...'+extension;
  806.  
  807. }